import json
import os
import random

from django.conf import settings
from django.forms import model_to_dict
from django.http import JsonResponse
from django.shortcuts import render
import re

from django.views import View
from django_redis import get_redis_connection

from common.errorcode import Error
from common.func import send_sms, create_token
from user.models import User, Profile



def sms(request):
    # 1,获取数据
    # json.loads 把字典形式的字符串 转换成 字典格式
    # json.dumps 把字典转换成 json字符串
    data = json.loads(request.body)

    # 2,判断数据
    # 判断手机号的格式是否正确
    if not re.match(r'1[345789]\d{9}$', data.get('phone')):
        return JsonResponse({'code':1000, 'data':'手机号格式错误'})

    # 3.处理逻辑
    # 把执行发短信的任务放入队列
    send_sms.delay(data.get('phone'))


    # 4.返回响应
    return JsonResponse({'code':0})


def login(request):

    # 1,获取数据
    data = json.loads(request.body)

    # 2,验证数据
    # 判断手机号的格式是否正确
    # if not re.match(r'1[345789]\d{9}$', data.get('phone')):
    #     return JsonResponse({'code': 1000, 'data': '手机号格式错误'})


    '''
    # 判断验证码是否正确
    smscode = data.get('smscode')
    # 1,判断验证码有没有过期
    redis_cli = get_redis_connection()
    redis_smscode = redis_cli.get(f'smscode-{data.get("phone")}')
    if not redis_smscode:
        return JsonResponse({'code': 1001, 'data': '验证码过期'})

    # 2,判断验证码是否输入正确
    if smscode != redis_smscode.decode():
        return JsonResponse({'code': 1002, 'data': '验证码输入错误'})
    '''


    # 3,处理逻辑
    # 判断用户表中有没有对应的手机号的记录,如果有就直接登录
    # 如果没有就插入一条登录的手机号的记录,在执行登录成功
    # try:
    #     user = User.objects.get(phonenum=data.get('phone'))
    # except User.DoesNotExist:
    #     user = User.objects.create(phonenum=data.get('phone'), nickname=data.get('phone'))


    # get_or_create 方法会 根据 除了 defaults 之外的字段 进行查询
    # defaults 中的字段 只参与 插入,不参与查询
    # 返回值有两个对象
    # 第一个对象是 查询或者 新增的数据对象
    # 第二个对象是 新增就是True, 查询就是False
    user, created = User.objects.get_or_create(phonenum=data.get('phone'), defaults={'nickname':data.get('phone')})


    # 生成token
    token = create_token(data.get('phone'))


    # 4,返回响应
    return JsonResponse({"code":0, "data":token})



class ProfileView(View):
    def get(self, request):
        # 根据 登录用户的id,去交友表中判断有没有相对应的用户交友资料
        # 如果有,就直接拿出来.如果没有就创建记录,并把新增的数据取出来

        # 后期可能会在很多接口都需要获取用户的交友资料
        # 那么就会 写 很多查询语句


        # # 获取交友资料的 location 和 dating_sex
        # location = request.user.profile.location
        # dating_sex = request.user.profile.dating_sex

        return JsonResponse({'code':10, 'data': model_to_dict(request.user.profile)})

    def put(self, request):
        # 1,获取数据
        data = json.loads(request.body)

        # 2,判断数据
        # 判断传递的最小年龄 要 小于 最大年龄
        if data.get('min_dating_age') >= data.get('max_dating_age'):
            return JsonResponse({'code': Error.MIN_AGE_LT_MAX_AGE, 'data': '最小年龄要小于最大年龄'})


        # 3,处理逻辑
        # 获取的前端传递的数据,插入到交友表中
        # update 方法返回值是修改成功记录的条数,没有成功修改返回False
        # create 方法返回值创建成功的数据的对象
        Profile.objects.filter(id=request.user.id).update(**data)

        # 4,返回响应
        return JsonResponse({'code':0, 'data': model_to_dict(request.user.profile)})



def avatar(request):
    # 1获取上传头像的数据
    img = request.FILES.get('img')

    ext = os.path.splitext(img.name)[1]

    filename = f'avatar-{request.user.phonenum}{ext}'
    filepath = os.path.join(settings.BASE_DIR, 'uploads', filename)

    with open(filepath, 'ab') as fp:
        for chunk in img.chunks():
            fp.write(chunk)

    # 2,把图片的路径更新到表中
    User.objects.filter(id=request.user.id).update(avatar=f'/uploads/{filename}')

    return JsonResponse({'code':0, 'data': f'/uploads/{filename}'})